package generics;

// 1. 简单泛型类（单个类型参数）
class Box<T> { // T是类型参数，可理解为"占位符"
    private T content; // 使用类型参数定义字段

    // 使用类型参数定义方法
    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() { // 使用类型参数作为返回值
        return content;
    }

    public void showType() {
        System.out.println("实际类型：" + content.getClass().getName());
    }
}

// 2. 多类型参数的泛型类
class Pair<K, V> { // K和V是两个类型参数
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }

    @Override
    public String toString() {
        return "(" + key + ", " + value + ")";
    }
}

// 3. 泛型类的使用
public class GenericClasses {
    public static void main(String[] args) {
        // 创建泛型类实例（指定具体类型）
        Box<String> stringBox = new Box<>();
        stringBox.setContent("Hello Generics");
        String str = stringBox.getContent(); // 无需转型
        stringBox.showType(); // 输出：实际类型：java.lang.String

        Box<Integer> intBox = new Box<>();
        intBox.setContent(100);
        int num = intBox.getContent(); // 自动拆箱
        intBox.showType(); // 输出：实际类型：java.lang.Integer

        // 使用多参数泛型类
        Pair<String, Integer> pair = new Pair<>("年龄", 25);
        System.out.println(pair); // 输出：(年龄, 25)
        String key = pair.getKey();
        Integer value = pair.getValue();
    }
}
